package multiplex.dataaccess.dao;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import multiplex.dataaccess.DaoException;
import multiplex.model.Usuario;

public class UsuarioDao extends AbstractDao{
	
	public Usuario get(int id) throws DaoException {
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Usuario WHERE id =?");
			st.setInt(1, id);
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				Usuario usuario = new Usuario();
				fillUsuario(usuario, rs);
				st.close();
				return usuario;
			}
		} catch(Exception e){
			throw new DaoException(e);
		}
		return null;
	}

	public List<Usuario> getAll() throws DaoException {
		List<Usuario> usuarioList = new ArrayList<Usuario>();
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Usuario");
			ResultSet rs = st.executeQuery();
			while(rs.next()){
				Usuario usuario = new Usuario();
				fillUsuario(usuario, rs);
				usuarioList.add(usuario);
			}
			st.close();
			return usuarioList;
		}catch(Exception e){
			throw new DaoException(e);
		}
	}
	
	public List<Usuario> getAllOrderByName() throws DaoException {
		List<Usuario> usuarioList = new ArrayList<Usuario>();
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Usuario ORDER BY NAME");
			ResultSet rs = st.executeQuery();
			while(rs.next()){
				Usuario usuario = new Usuario();
				fillUsuario(usuario, rs);
				usuarioList.add(usuario);
			}
			st.close();
			return usuarioList;
		}catch(Exception e){
			throw new DaoException(e);
		}
	}

	public void save(Usuario usuario) throws DaoException {
		try{
			PreparedStatement st = getConnection().prepareStatement(
					"INSERT INTO Usuario (nome, cpf, endereco, dataNascimento, email, login, senha) " +
					"VALUES (?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
			fillPreparatedStatement(st, usuario);
			st.execute();
			ResultSet rs = st.getGeneratedKeys();
			rs.next();
			usuario.setId(rs.getInt(1));
			st.close();
		}catch(Throwable e){
			throw new DaoException(e);
		}
	}
	
	public void update(Usuario usuario) throws DaoException {
		try{
			PreparedStatement st = getConnection().prepareStatement(
					"UPDATE Usuario SET nome=?, cpf=?, endereco=?, dataNascimento=?, " +
					"email=?, login=?, senha=? WHERE id=?");				
			fillPreparatedStatement(st, usuario);
			st.setInt(8, usuario.getId());
			st.execute();
			st.close();
		}catch(Throwable e){
			throw new DaoException(e);
		}
	}

	public void remove(Usuario usuario) throws DaoException {
		try{
			PreparedStatement st = getConnection().prepareStatement(
					"DELETE FROM Usuario WHERE id=? ");
			st.setInt(1, usuario.getId());
			st.execute();
			st.close();		
		}catch(Throwable e){
			throw new DaoException(e);
		}	
	}
	
	public Usuario getByLoginAndSenha(String login, String senha){
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Usuario WHERE login =? AND senha = ?");
			st.setString(1, login);
			st.setString(2, senha);
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				Usuario usuario = new Usuario();
				fillUsuario(usuario, rs);
				st.close();
				return usuario;
			}
		} catch(Exception e){
			throw new DaoException(e);
		}
		return null;	
	}
	
	private void fillUsuario(Usuario usuario, ResultSet rs) throws SQLException {
		Calendar calendar = Calendar.getInstance();
		usuario.setId(rs.getInt("id"));
		usuario.setNome(rs.getString("nome"));
		usuario.setCpf(rs.getString("cpf"));
		usuario.setEndereco(rs.getString("endereco"));
		calendar.setTime(rs.getDate("dataNascimento"));
		usuario.setDataNascimento(calendar);
		usuario.setEmail(rs.getString("email"));
		usuario.setLogin(rs.getString("login"));
		usuario.setSenha(rs.getString("senha"));
	}
	
	private void fillPreparatedStatement(PreparedStatement st, Usuario usuario) throws SQLException {
		st.setString(1,usuario.getNome());
		st.setString(2,usuario.getCpf());
		st.setString(3,usuario.getEndereco());
		st.setDate(4, new Date(usuario.getDataNascimento().getTimeInMillis()) );
		st.setString(5, usuario.getEmail());
		st.setString(6, usuario.getLogin());
		st.setString(7, usuario.getSenha());
	}
	
}
